# 闭包
"""
方法里面嵌套子方法，外方法返回的是子方法的地址值
这样就形成了闭包
"""
# 写一个每次调用函数，自增长+1
def num():
    a = 1
    def add():
        nonlocal a      # nonlocal:修改局部变量的值
        a += 1
        return a        # 返回每次+1的值
    return add      # 外函数返回的是子函数的地址值

# 调用闭包函数
# a = num()
# print(a())      # 2
# print(a())      # 3
# print(a())      # 4

# print(num()())
# print(num()())
# print(num()())


# 装饰器：
"""
装饰器的意义：
为已经上线的功能，增加一些新的内容，在不改变原来的方法调用情况下、不改变原来方法内容的情况下，新增功能
"""


# run()

#我想加一个：健身的功能，不能改变run方法调用，也不可以修改里面的内容
#           我有的时候还会只调用  正在跑步的功能，不要健身
"""
def run():
    print("健身")
    print("正在跑步")
# run()
"""
"""
def run():
    # print("健身")
    print("正在跑步")
# 编写一个装饰器，实现上面的功能
def xiushi(func):       # func ：表示要传入修饰的方法
    def luoji():        # 嵌套一个子方法
        func()  # 调用原来的老的方法
        print("健身")   # 增加新的功能
                  
    return luoji        # 外函数返回子函数的地址值

# 调用装饰器
x = xiushi(run)
# 调用修改后的功能
x()

# 原来的方法还能用吗?
print("=============")
run()
"""


def eating(func):
    def luoji():
        print("吃的是汉堡")
        func()
        print("完毕")
    return luoji


# 简化引用装饰器，也叫做python的语法糖
@eating
def eat():
    print("正在吃饭")
def drink():
    print("喝水")

# eat()

#调用装饰器
# e = eating(drink)
# e()
def eats(func):
    def luoji(*args,**kwargs):      # 是为了适配所有的函数引用。
        func(*args,**kwargs)
        print("吃完啦，好开心！！！")
    return luoji

@eats
def eat1(type):
    print(f"今天吃的是：{type}")

eat1("汉堡包")








